ÕâµÀÌ⣬ÄܰÑÌâÒâ¿´Ã÷°×£¬¾ÍºÜ²»ÈÝÒ×ÁË¡£

 1,2,0     ->  0,1,2,3     ->  size == 3
                     ^
 3,4,-1,1  ->  -1,1,2,3,4  ->  size == 4
                    ^  

°´ÕÕÉÏÊöÅÅÁз½Ê½£¬¾ÍÄܺÜÇåÎúµÄ¿´³ö£¬First Missing Positive µÄº¬Òå¡£Õâ¸öÊýÓÐÈçϼ¸¸öÌõ¼þ£º

  • ×î´óΪ n+1. (ÏëÏóµÚÒ»¸öÀý×Ó£¬¼«¶ËÇé¿öΪ 1,2,3, ÄÇô result ¼´Îª 4, ǡΪ n+1)
  • ×îСΪ 1.
  • 1 ~ n+1 Öм䣬µÚÒ»¸öȱµÄÊý£¬¼´Îª·µ»Ø½á¹û¡£(ÈÝÒ×Àí½â£¬Èç¹û 1~n ¶¼Ã»ÓÐȱµÄ£¬ÄÇô½á¹ûÒ»¶¨ÊÇ n+1 ÁË)

ËùÒÔÎÊÌâÀ´ÁË£¬ÔõôÄÜÔÚÒ»´Îµü´úÖÐÕÒ³öȱµÄÄǸö£¿ÏëÏóÎÒÃÇ´óÄÔÊÇÈçºÎÒ»ÏÂ×Ó¿´³öÀ´µÄ£¿àÅ£¬ÅÅÁС£

µ«ÅÅÁÐÍ꣬¾ÍÒѾ­ºÄ·ÑÁË O(N)£¬ÓÖÒª»¨ O(N) ȥȷÈÏȱµÄÄǸöÊý¡£Æäʵ£¬ÎÒÃÇÕæµÄÊÇÅÅÍêÐò²ÅÖªµÀ¿ÕȱÂð£¿ÏÔÈ»²»ÊÇ¡£

ÁíÍ⣬ÕâµÀÌâÒªÇó²»ÄÜÓöîÍâµÄ¿Õ¼ä£¬¼´Ê¹ÍùÅÅÐòÉÏÏ룬ҲֻÄÜÏë×ÅÈçºÎ swap ÁË¡£


Ò»°ãµÄÅÅÐò£¬µÄÈ·ÊDZȽϸ´Ôӵġ£µ«×Ðϸ¹Û²ìÕâµÀÌ⣬Äܹ»·¢ÏÖÕâ¸ö”ÅÅÐò”È´±È½ÏÌØÊ⣬Ê×ÏÈËüÊÇ´Ó 1 ¿ªÊ¼µÄ£¬ÇÒÁ¬Ðø¡£

ÕâÈÃÎÒÃÇÏëµ½ÁËÉñÂí£¿Ã»´í£¬ÏñÐòºÅ£¬¾ÍÈçÊý¾Ý¿â±íµÄ×ÔÔöÖ÷¼üÒ»Ñù£¡ÄÇôÕÒµ½È±µÄ£¬Æñ²»ÊÇÒ»Ñ۾Ϳ´³öÀ´ÁË£¿

ÈçºÎÄÜÈÃÕâ¸öÎÞÐòµÄÊý×飬¿´ÆðÀ´ÏñÐòºÅÒ»ÑùÄØ£¿¶øÇÒÊÖ¶ÎÖ»ÓÐ swap. ÓÐÁË£¬ÐòºÅÎÒÃÇÊÇÖªµÀµÄ°¡£¬ÕâÑù swap ¾ÍÓÐÃ÷È·µÄÄ¿µÄÁË¡£

 index:  1, 2, 3, 4
 array:  3, 4,-1, 1
         ^     ^    --- swap(3,-1)
        -1, 4, 3, 1
            ^     ^ --- swap(4, 1)
        -1, 1, 3, 4
         ^  ^       --- swap(1,-1)
         1,-1, 3, 4
            ^

¾­¹ý¼¸²½ swap, ÎÒÃǾªÈ˵ķ¢ÏÖ×îÖÕ¶Ô²»ÆëµÄÄǸöÐòºÅ£¨2 : -1£©¾ÍÊÇÎÒÃÇÒªµÄ½á¹û£¡ÎÒÃdz¢ÊÔÓôúÂëÃèÊöÉÏÊö¹ý³Ì£º

for (int i=0; i<n; ++i)
     while (A[i]>0 && A[i]<=n && A[i]!=A[A[i]-1]) // ǰÁ½¸öÌõ¼þÏÞ¶¨·¶Î§£¬×îºóÊÇÈç¹ûÐòºÅλÖõÄÖµÓ뵱ǰֵһÑù£¬½»»»ÎÞÒâÒå
          swap(A[i], A[A[i]-1]);
for (int i=0; i<n; ++i)
     if (A[i] != i+1) return i+1; // ×îºóµÄ¼ì²é£¬Ò»µ©·¢ÏÖÓëÐòºÅ²»·û£¬Á¢¿Ì·µ»Ø
return n+1; // Èç¹û¶¼Ïà·û£¬ÄÇô·µ»Ø n+1

6ÐУ¬Ìá½»£¬×î¸ßЧÂÊ AC.(4ms)

#include <iostream>
using std::swap;

class Solution {
public:
    int firstMissingPositive(int A[], int n) {
        for (int i=0; i<n; ++i)
            while (A[i]>0 && A[i]<=n && A[i]!=A[A[i]-1])
                swap(A[i], A[A[i]-1]);
        for (int i=0; i<n; ++i)
            if (A[i] != i+1) return i+1;
        return n+1;
    }
};

LeetCode Direct Link